<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <!-- 
    深拷贝 
        深度拷贝就是把父对象拷贝到子对象上，并且两者的内存和以后的操作是互不影响的
    -->

    <script>
        // 父对象
        let obj = {
            id: 1,
            name: "hy",
            nu: null,
            arr: [1, 2, 3, ["数组成员1", "数组成员2"], {}],
            ob: {
                a: 1111,
                fn: function () {}
            }
        };


        // 子对象
        let childObj = {};
        deepClone(childObj, obj);

        function deepClone(newObj, oldObj) {
            for (let k in oldObj) {
                // console.log(k);
                // 检测键值是否是数组
                if (oldObj[k] instanceof Array) {
                    // 新数组
                    newObj[k] = [];

                    // 递归(自己调用自己)
                    deepClone(newObj[k], oldObj[k]);

                    // console.log(obj[k]); // [1, 2, 3]
                    //  遍历数组成员，然后克隆到新数组childObj[k]
                    // for (let k1 in oldObj[k]) {
                    //     // console.log(obj[k][k1]);
                    //     newObj[k][k1] = oldObj[k][k1];
                    // if (obj[k][k1] instanceof Array) {
                    //     // console.log(obj[k][k1]);
                    //     for (let k2 in oldObj[k][k1]) {
                    //         console.log(oldObj[k][k1][k2]);
                    //         newObj[k][k1][k2] = oldObj[k][k1][k2];
                    //     }
                    // }else if (oldObj[k] instanceof Object) {

                    // }
                    // };

                } else if (oldObj[k] instanceof Object) {
                    // 检测键值是否是对象
                    // 新对象
                    newObj[k] = {};

                    // 递归(自己调用自己)
                    deepClone(newObj[k], oldObj[k]);


                    // console.log(obj[k]);
                    //  遍历对象属性，然后克隆到新对象childObj[k]
                    // for (let k2 in oldObj[k]) {
                    //     // console.log(obj[k][k2]);
                    //     newObj[k][k2] = oldObj[k][k2];
                    // }

                } else {
                    newObj[k] = oldObj[k];
                }
            }
        };


        childObj["id"] = 10;
        childObj["arr"][0] = 999;
        childObj["ob"]["a"] = 9999;
        childObj["ob"]["fn"] = function () {
            return "哈哈哈";
        };
        childObj["arr"][3][0] = "数组成员3";
        console.log("childObj", childObj);
        console.log("obj", obj);
    </script>
</body>

</html>